﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ATEC.ATDataCoreNET;
using ATEC.ATCore;
using ATEC.GeometryNET;
using ATEC.ATDataCoreNET.ATObjects;
using SSDPNET;
using System.Windows.Controls;
namespace ViewExample
{
    /// <summary>
    /// 类名：ViewClipAndSaveExample
    /// 分类：玄镜BIM图形平台/C#开发/示例代码/视图操作
    /// 功能：展示视图剪切和保存相关的操作，包括创建剪切对象、视图剪切、保存和参照等功能。
    /// 关键类及说明：
    ///     - ATScene：场景类，管理三维场景内容
    ///     - ATViewClipSettings：视图剪切设置类，控制剪切参数
    ///     - ATViewClipUtl：视图剪切工具类，提供剪切相关操作
    ///     - ATViewSaveUtl：视图保存工具类，提供视图保存和参照功能
    /// </summary>
    public class ViewClipAndSaveExample
    {
        /// <summary>
        /// 方法名：GetSpatialScene
        /// 分类：玄镜BIM图形平台/C#开发/示例代码/视图操作/场景
        /// 功能：获取名为"三维模型空间"的场景。
        /// 参数：无
        /// 返回值：ATScene，获取到的场景对象
        /// 说明：
        ///     从当前活动场景开始查找指定名称的场景；
        ///     如果未找到或出现错误则返回null。
        /// </summary>
        static ATScene GetSpatialScene()
        {
            ATScene activeScene = Session.Entity.GetActiveATScenes();
       
            if (activeScene == null)
            {
                return null;
            }
            ATProject project= activeScene.GetATProject();
            if(project==null)
            {
                return null;
            }

            SceneID sceneID= project.FindSceneIdByName("三维模型空间");
            StatusInt status = StatusInt.Error;
            ATScene scene = project.LoadRootSceneById(ref status, sceneID);
            return scene;

        }

        /// <summary>
        /// 方法名：GetHorizonScene
        /// 分类：玄镜BIM图形平台/C#开发/示例代码/视图操作/场景
        /// 功能：获取名为"三维设计"的场景。
        /// 参数：无
        /// 返回值：ATScene，获取到的场景对象
        /// 说明：
        ///     从当前活动场景开始查找指定名称的场景；
        ///     如果未找到或出现错误则返回null。
        /// </summary>
        static ATScene GetHorizonScene()
        {
            ATScene activeScene = Session.Entity.GetActiveATScenes();

            if (activeScene == null)
            {
                return null;
            }
            ATProject project = activeScene.GetATProject();
            if (project == null)
            {
                return null;
            }

            SceneID sceneID = project.FindSceneIdByName("三维设计");
            StatusInt status = StatusInt.Error;
            ATScene scene = project.LoadRootSceneById(ref status, sceneID);
            return scene;
        }

        /// <summary>
        /// 方法名：CreateObject
        /// 分类：玄镜BIM图形平台/C#开发/示例代码/视图操作/对象创建
        /// 功能：在空间场景中创建一个球体对象。
        /// 参数：无
        /// 返回值：无
        /// 关键类及说明：
        ///     - ATSphereDetail：球体详细信息类，定义球体的位置和半径
        ///     - BaseSolid：基础实体类，用于创建三维几何体
        ///     - GeometryToATObject：几何转换工具类，将几何体转换为平台对象
        /// </summary>
        public static void CreateObject()
        {
            ATSphereDetail sphere = new ATSphereDetail(XPoint3d.FromXYZ(0, 0, 0), 10000.0);
            BaseSolid solid = BaseSolid.CreateATSphere(sphere);
            ATScene sourceScene = GetSpatialScene();
            ATObject obj = GeometryToATObject.ToObject(sourceScene.GetATScene(), solid, null);
            if (obj.IsValid)
            {
                obj.AddToScene();
            }
        }
        /// <summary>
        /// 方法名：ClipViewByObject
        /// 分类：玄镜BIM图形平台/C#开发/示例代码/视图操作/剪切
        /// 功能：根据给定对象剪切视图，创建一个矩形区域作为剪切边界。
        /// 参数：无
        /// 返回值：无
        /// 关键类及说明：
        ///     - ATViewClipSettings：视图剪切设置类，控制剪切显示效果
        ///     - CurveSet：曲线集合类，用于创建剪切边界
        /// 说明：
        ///     创建一个30000x30000的矩形作为剪切边界；
        ///     设置剪切面的显示属性和样式。
        /// </summary>
        public static void ClipViewByObject()
        {
            //创建剪切对象
            double v = 15000.0;
            XPoint3d pt1 = XPoint3d.FromXYZ(-v, v, 0);
            XPoint3d pt2 = XPoint3d.FromXYZ(-v, -v, 0);
            XPoint3d pt3 = XPoint3d.FromXYZ(v, -v, 0);
            XPoint3d pt4 = XPoint3d.FromXYZ(v, v, 0);
            List<XPoint3d> pts=new List<XPoint3d>{ pt1,pt2,pt3,pt4,pt1 };
            CurveSet curve = CurveSet.CreateLinear(pts, CurveSet.BoundaryType.Outer,true);
            ATScene scene = GetSpatialScene();
            //剪切设置
            ATEC.ATCoreNET.ATViewClipSettings settings=new ATEC.ATCoreNET.ATViewClipSettings();
            settings.DisplayBackward = false;//前
            settings.DisplayForward = false;//后 
            settings.DisplayOutside = false;//外
            settings.DisplayCut = true;

            settings.CutStyle = "NewStyle";//剪切样式
            ATObject obj = GeometryToATObject.ToObject(scene.GetATScene(), curve, null);

            if (obj.IsValid)
            {
                obj.AddToScene();
            
                int view = IViewManager.GetActiveViewSet().GetSelectedView();
                StatusInt status = ATEC.ATCoreNET.ATViewClipUtl.DoClipViewByObject(view, obj.ObjectId, settings);
            }


        }
        /// <summary>
        /// 方法名：ClipViewByVolume
        /// 分类：玄镜BIM图形平台/C#开发/示例代码/视图操作/剪切
        /// 功能：根据给定参数创建剪切立方体并剪切视图。
        /// 参数：无
        /// 返回值：无
        /// 关键类及说明：
        ///     - ATViewClipSettings：视图剪切设置类，控制剪切显示效果
        /// 说明：
        ///     先清除已有的剪切立方体；
        ///     使用指定的高度、深度和法向量创建新的剪切体。
        /// </summary>
        public static void ClipViewByVolume()
        {
            ClearClipViewVolume();//清除剪切立方体
            XVector3d vecNormal = XVector3d.FromXYZ(-1, 1, 1);
            vecNormal.NormalizeInPlace();
            double topHeight = 10000.0;
            double btmHeight = 20000.0;
            double frontDepth = 30000.0;
            double backDepth = 40000.0;

            ATEC.ATCoreNET.ATViewClipSettings settings=new ATEC.ATCoreNET.ATViewClipSettings();
            settings.DisplayBackward = false;
            settings.DisplayForward = true;
            settings.DisplayOutside = false;
            settings.DisplayCut = false;

            settings.CutStyle = "NewStyle";
            int view = IViewManager.GetActiveViewSet().GetSelectedView();
            StatusInt status = ATEC.ATCoreNET.ATViewClipUtl.DoClipViewByVolume(view, XPoint3d.Zero,
                XPoint3d.FromXYZ(10000, 10000, 0), vecNormal, settings, topHeight, btmHeight, frontDepth, backDepth);
    
        }
        /// <summary>
        /// 方法名：ClearClipViewVolume
        /// 分类：玄镜BIM图形平台/C#开发/示例代码/视图操作/剪切
        /// 功能：清除当前视图的剪切立方体。
        /// 参数：无
        /// 返回值：无
        /// 说明：
        ///     检查视口的有效性后清除剪切立方体。
        /// </summary>
        public static void ClearClipViewVolume()
        {
            int view = IViewManager.GetActiveViewSet().GetSelectedView();
            Viewport viewPort = IViewManager.GetActiveViewSet().GetViewport(view);
            if (null == viewPort)
            {
                return;
            }
                
            if (!viewPort.GetRootScene().IsValid())
            {
                return;
            }
                
            StatusInt status = ATEC.ATCoreNET.ATViewClipUtl.ClearClipViewVolume(view);
            
        }
        /// <summary>
        /// 方法名：ClearClipView
        /// 分类：玄镜BIM图形平台/C#开发/示例代码/视图操作/剪切
        /// 功能：清除当前视图的所有剪切效果。
        /// 参数：无
        /// 返回值：无
        /// </summary>
        public static void ClearClipView()
        {
            int view = IViewManager.GetActiveViewSet().GetSelectedView();
            StatusInt status = ATEC.ATCoreNET.ATViewClipUtl.ClearClipView(view);
       
        }

        /// <summary>
        /// 方法名：SaveViewByView
        /// 分类：玄镜BIM图形平台/C#开发/示例代码/视图操作/保存
        /// 功能：根据当前视口保存视图。
        /// 参数：无
        /// 返回值：无
        /// 说明：
        ///     保存视图时指定名称为"newViewByView"；
        ///     添加描述信息"descByView"。
        /// </summary>
        public static void SaveViewByView()
        {
            int view = IViewManager.GetActiveViewSet().GetSelectedView();
            string  viewName="newViewByView";
            string viewDesc="descByView";
            ATEC.ATCoreNET.ATViewSaveUtl.DoSaveViewByView(viewName, viewDesc, view);
        }
        /// <summary>
        /// 方法名：SaveViewByRange
        /// 分类：玄镜BIM图形平台/C#开发/示例代码/视图操作/保存
        /// 功能：根据给定范围保存视图。
        /// 参数：无
        /// 返回值：无
        /// 说明：
        ///     指定视图范围从原点到(200000,200000,-200000)；
        ///     使用默认变换矩阵。
        /// </summary>
        public static void SaveViewByRange()
        {
            int view = IViewManager.GetActiveViewSet().GetSelectedView();
            string viewName="newViewByRange";
            string viewDesc ="descByRange";
            ATEC.ATCoreNET.ATViewSaveUtl.DoSaveViewByRange(viewName, viewDesc, view, XPoint3d.Zero,
                XPoint3d.FromXYZ(200000, 200000, -200000), XMatrix3d.Identity);
        }
        /// <summary>
        /// 方法名：AttachSavedView
        /// 分类：玄镜BIM图形平台/C#开发/示例代码/视图操作/参照
        /// 功能：将保存的视图参照到目标场景。
        /// 参数：无
        /// 返回值：无
        /// 说明：
        ///     将之前保存的两个视图参照到三维设计场景中；
        ///     设置不同的参照位置和缩放比例。
        /// </summary>
        public static void AttachSavedView()
        {
            ATSceneRef sceneref = SSDPNET.ScenesFunctions.SceneRefGetActive();
            if (sceneref == null)
            {
                return;
            }

            ATScene destScene = GetHorizonScene();
            if (destScene == null)
            {
                return;
            }
            ATScene sourceScene = GetSpatialScene();
            if (sourceScene == null)
            {
                return;
            }
            List<string> viewNames = new List<string> { "newViewByView", "newViewByRange" };
            foreach (string viename in viewNames)
            {
                int i = 0;
         
                XPoint3d origin = XPoint3d.FromXYZ(10000 + i * 100000, 20000, 0);
                double scale = 2.0;
                ATEC.ATCoreNET.ATViewSaveUtl.AttachSavedView(destScene, sourceScene, viename, origin, scale);
                i++;
            }
         
        }
        /// <summary>
        /// 方法名：DeleteSavedView
        /// 分类：玄镜BIM图形平台/C#开发/示例代码/视图操作/删除
        /// 功能：删除指定的已保存视图。
        /// 参数：无
        /// 返回值：无
        /// 说明：
        ///     删除名为"newViewByView"和"newViewByRange"的视图；
        ///     删除时不进行确认提示。
        /// </summary>
        public static void DeleteSavedView()
        {
            List<string> viewNames = new List<string> { "newViewByView" ,"newViewByRange"  };
            ATScene sourceScene = GetSpatialScene();
            if (sourceScene == null)
            {
                return;
            }
            foreach (string viename in viewNames)
            {
                ATEC.ATCoreNET.ATViewSaveUtl.DeleteSavedView(sourceScene, viename,false);
            }
      
        }
    }


}
